home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / sparc / include / asm / ptrace_64.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  8.3 KB  |  357 lines

  1. #ifndef _SPARC64_PTRACE_H
  2. #define _SPARC64_PTRACE_H
  3.  
  4. #include <asm/pstate.h>
  5.  
  6. /* This struct defines the way the registers are stored on the
  7.  * stack during a system call and basically all traps.
  8.  */
  9.  
  10. /* This magic value must have the low 9 bits clear,
  11.  * as that is where we encode the %tt value, see below.
  12.  */
  13. #define PT_REGS_MAGIC 0x57ac6c00
  14.  
  15. #ifndef __ASSEMBLY__
  16.  
  17. #include <linux/types.h>
  18.  
  19. struct pt_regs {
  20.     unsigned long u_regs[16]; /* globals and ins */
  21.     unsigned long tstate;
  22.     unsigned long tpc;
  23.     unsigned long tnpc;
  24.     unsigned int y;
  25.  
  26.     /* We encode a magic number, PT_REGS_MAGIC, along
  27.      * with the %tt (trap type) register value at trap
  28.      * entry time.  The magic number allows us to identify
  29.      * accurately a trap stack frame in the stack
  30.      * unwinder, and the %tt value allows us to test
  31.      * things like "in a system call" etc. for an arbitray
  32.      * process.
  33.      *
  34.      * The PT_REGS_MAGIC is choosen such that it can be
  35.      * loaded completely using just a sethi instruction.
  36.      */
  37.     unsigned int magic;
  38. };
  39.  
  40. struct pt_regs32 {
  41.     unsigned int psr;
  42.     unsigned int pc;
  43.     unsigned int npc;
  44.     unsigned int y;
  45.     unsigned int u_regs[16]; /* globals and ins */
  46. };
  47.  
  48. #define UREG_G0        0
  49. #define UREG_G1        1
  50. #define UREG_G2        2
  51. #define UREG_G3        3
  52. #define UREG_G4        4
  53. #define UREG_G5        5
  54. #define UREG_G6        6
  55. #define UREG_G7        7
  56. #define UREG_I0        8
  57. #define UREG_I1        9
  58. #define UREG_I2        10
  59. #define UREG_I3        11
  60. #define UREG_I4        12
  61. #define UREG_I5        13
  62. #define UREG_I6        14
  63. #define UREG_I7        15
  64. #define UREG_FP        UREG_I6
  65. #define UREG_RETPC     UREG_I7
  66.  
  67. /* A V9 register window */
  68. struct reg_window {
  69.     unsigned long locals[8];
  70.     unsigned long ins[8];
  71. };
  72.  
  73. /* A 32-bit register window. */
  74. struct reg_window32 {
  75.     unsigned int locals[8];
  76.     unsigned int ins[8];
  77. };
  78.  
  79. /* A V9 Sparc stack frame */
  80. struct sparc_stackf {
  81.     unsigned long locals[8];
  82.         unsigned long ins[6];
  83.     struct sparc_stackf *fp;
  84.     unsigned long callers_pc;
  85.     char *structptr;
  86.     unsigned long xargs[6];
  87.     unsigned long xxargs[1];
  88. };
  89.  
  90. /* A 32-bit Sparc stack frame */
  91. struct sparc_stackf32 {
  92.     unsigned int locals[8];
  93.         unsigned int ins[6];
  94.     unsigned int fp;
  95.     unsigned int callers_pc;
  96.     unsigned int structptr;
  97.     unsigned int xargs[6];
  98.     unsigned int xxargs[1];
  99. };
  100.  
  101. struct sparc_trapf {
  102.     unsigned long locals[8];
  103.     unsigned long ins[8];
  104.     unsigned long _unused;
  105.     struct pt_regs *regs;
  106. };
  107.  
  108. #define TRACEREG_SZ    sizeof(struct pt_regs)
  109. #define STACKFRAME_SZ    sizeof(struct sparc_stackf)
  110.  
  111. #define TRACEREG32_SZ    sizeof(struct pt_regs32)
  112. #define STACKFRAME32_SZ    sizeof(struct sparc_stackf32)
  113.  
  114. #ifdef __KERNEL__
  115.  
  116. #include <linux/threads.h>
  117. #include <asm/system.h>
  118.  
  119. static inline int pt_regs_trap_type(struct pt_regs *regs)
  120. {
  121.     return regs->magic & 0x1ff;
  122. }
  123.  
  124. static inline bool pt_regs_is_syscall(struct pt_regs *regs)
  125. {
  126.     return (regs->tstate & TSTATE_SYSCALL);
  127. }
  128.  
  129. static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
  130. {
  131.     return (regs->tstate &= ~TSTATE_SYSCALL);
  132. }
  133.  
  134. #define arch_ptrace_stop_needed(exit_code, info) \
  135. ({    flush_user_windows(); \
  136.     get_thread_wsaved() != 0; \
  137. })
  138.  
  139. #define arch_ptrace_stop(exit_code, info) \
  140.     synchronize_user_stack()
  141.  
  142. struct global_reg_snapshot {
  143.     unsigned long        tstate;
  144.     unsigned long        tpc;
  145.     unsigned long        tnpc;
  146.     unsigned long        o7;
  147.     unsigned long        i7;
  148.     unsigned long        rpc;
  149.     struct thread_info    *thread;
  150.     unsigned long        pad1;
  151. };
  152. extern struct global_reg_snapshot global_reg_snapshot[NR_CPUS];
  153.  
  154. #define force_successful_syscall_return()        \
  155. do {    current_thread_info()->syscall_noerror = 1; \
  156. } while (0)
  157. #define user_mode(regs) (!((regs)->tstate & TSTATE_PRIV))
  158. #define instruction_pointer(regs) ((regs)->tpc)
  159. #define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP])
  160. #define regs_return_value(regs) ((regs)->u_regs[UREG_I0])
  161. #ifdef CONFIG_SMP
  162. extern unsigned long profile_pc(struct pt_regs *);
  163. #else
  164. #define profile_pc(regs) instruction_pointer(regs)
  165. #endif
  166. extern void show_regs(struct pt_regs *);
  167. #endif
  168.  
  169. #else /* __ASSEMBLY__ */
  170. /* For assembly code. */
  171. #define TRACEREG_SZ        0xa0
  172. #define STACKFRAME_SZ        0xc0
  173.  
  174. #define TRACEREG32_SZ        0x50
  175. #define STACKFRAME32_SZ        0x60
  176. #endif
  177.  
  178. #ifdef __KERNEL__
  179. #define STACK_BIAS        2047
  180. #endif
  181.  
  182. /* These are for pt_regs. */
  183. #define PT_V9_G0     0x00
  184. #define PT_V9_G1     0x08
  185. #define PT_V9_G2     0x10
  186. #define PT_V9_G3     0x18
  187. #define PT_V9_G4     0x20
  188. #define PT_V9_G5     0x28
  189. #define PT_V9_G6     0x30
  190. #define PT_V9_G7     0x38
  191. #define PT_V9_I0     0x40
  192. #define PT_V9_I1     0x48
  193. #define PT_V9_I2     0x50
  194. #define PT_V9_I3     0x58
  195. #define PT_V9_I4     0x60
  196. #define PT_V9_I5     0x68
  197. #define PT_V9_I6     0x70
  198. #define PT_V9_FP     PT_V9_I6
  199. #define PT_V9_I7     0x78
  200. #define PT_V9_TSTATE 0x80
  201. #define PT_V9_TPC    0x88
  202. #define PT_V9_TNPC   0x90
  203. #define PT_V9_Y      0x98
  204. #define PT_V9_MAGIC  0x9c
  205. #define PT_TSTATE    PT_V9_TSTATE
  206. #define PT_TPC        PT_V9_TPC
  207. #define PT_TNPC        PT_V9_TNPC
  208.  
  209. /* These for pt_regs32. */
  210. #define PT_PSR    0x0
  211. #define PT_PC     0x4
  212. #define PT_NPC    0x8
  213. #define PT_Y      0xc
  214. #define PT_G0     0x10
  215. #define PT_WIM    PT_G0
  216. #define PT_G1     0x14
  217. #define PT_G2     0x18
  218. #define PT_G3     0x1c
  219. #define PT_G4     0x20
  220. #define PT_G5     0x24
  221. #define PT_G6     0x28
  222. #define PT_G7     0x2c
  223. #define PT_I0     0x30
  224. #define PT_I1     0x34
  225. #define PT_I2     0x38
  226. #define PT_I3     0x3c
  227. #define PT_I4     0x40
  228. #define PT_I5     0x44
  229. #define PT_I6     0x48
  230. #define PT_FP     PT_I6
  231. #define PT_I7     0x4c
  232.  
  233. /* Reg_window offsets */
  234. #define RW_V9_L0     0x00
  235. #define RW_V9_L1     0x08
  236. #define RW_V9_L2     0x10
  237. #define RW_V9_L3     0x18
  238. #define RW_V9_L4     0x20
  239. #define RW_V9_L5     0x28
  240. #define RW_V9_L6     0x30
  241. #define RW_V9_L7     0x38
  242. #define RW_V9_I0     0x40
  243. #define RW_V9_I1     0x48
  244. #define RW_V9_I2     0x50
  245. #define RW_V9_I3     0x58
  246. #define RW_V9_I4     0x60
  247. #define RW_V9_I5     0x68
  248. #define RW_V9_I6     0x70
  249. #define RW_V9_I7     0x78
  250.  
  251. #define RW_L0     0x00
  252. #define RW_L1     0x04
  253. #define RW_L2     0x08
  254. #define RW_L3     0x0c
  255. #define RW_L4     0x10
  256. #define RW_L5     0x14
  257. #define RW_L6     0x18
  258. #define RW_L7     0x1c
  259. #define RW_I0     0x20
  260. #define RW_I1     0x24
  261. #define RW_I2     0x28
  262. #define RW_I3     0x2c
  263. #define RW_I4     0x30
  264. #define RW_I5     0x34
  265. #define RW_I6     0x38
  266. #define RW_I7     0x3c
  267.  
  268. /* Stack_frame offsets */
  269. #define SF_V9_L0     0x00
  270. #define SF_V9_L1     0x08
  271. #define SF_V9_L2     0x10
  272. #define SF_V9_L3     0x18
  273. #define SF_V9_L4     0x20
  274. #define SF_V9_L5     0x28
  275. #define SF_V9_L6     0x30
  276. #define SF_V9_L7     0x38
  277. #define SF_V9_I0     0x40
  278. #define SF_V9_I1     0x48
  279. #define SF_V9_I2     0x50
  280. #define SF_V9_I3     0x58
  281. #define SF_V9_I4     0x60
  282. #define SF_V9_I5     0x68
  283. #define SF_V9_FP     0x70
  284. #define SF_V9_PC     0x78
  285. #define SF_V9_RETP   0x80
  286. #define SF_V9_XARG0  0x88
  287. #define SF_V9_XARG1  0x90
  288. #define SF_V9_XARG2  0x98
  289. #define SF_V9_XARG3  0xa0
  290. #define SF_V9_XARG4  0xa8
  291. #define SF_V9_XARG5  0xb0
  292. #define SF_V9_XXARG  0xb8
  293.  
  294. #define SF_L0     0x00
  295. #define SF_L1     0x04
  296. #define SF_L2     0x08
  297. #define SF_L3     0x0c
  298. #define SF_L4     0x10
  299. #define SF_L5     0x14
  300. #define SF_L6     0x18
  301. #define SF_L7     0x1c
  302. #define SF_I0     0x20
  303. #define SF_I1     0x24
  304. #define SF_I2     0x28
  305. #define SF_I3     0x2c
  306. #define SF_I4     0x30
  307. #define SF_I5     0x34
  308. #define SF_FP     0x38
  309. #define SF_PC     0x3c
  310. #define SF_RETP   0x40
  311. #define SF_XARG0  0x44
  312. #define SF_XARG1  0x48
  313. #define SF_XARG2  0x4c
  314. #define SF_XARG3  0x50
  315. #define SF_XARG4  0x54
  316. #define SF_XARG5  0x58
  317. #define SF_XXARG  0x5c
  318.  
  319. #ifdef __KERNEL__
  320.  
  321. /* global_reg_snapshot offsets */
  322. #define GR_SNAP_TSTATE    0x00
  323. #define GR_SNAP_TPC    0x08
  324. #define GR_SNAP_TNPC    0x10
  325. #define GR_SNAP_O7    0x18
  326. #define GR_SNAP_I7    0x20
  327. #define GR_SNAP_RPC    0x28
  328. #define GR_SNAP_THREAD    0x30
  329. #define GR_SNAP_PAD1    0x38
  330.  
  331. #endif  /*  __KERNEL__  */
  332.  
  333. /* Stuff for the ptrace system call */
  334. #define PTRACE_SPARC_DETACH       11
  335. #define PTRACE_GETREGS            12
  336. #define PTRACE_SETREGS            13
  337. #define PTRACE_GETFPREGS          14
  338. #define PTRACE_SETFPREGS          15
  339. #define PTRACE_READDATA           16
  340. #define PTRACE_WRITEDATA          17
  341. #define PTRACE_READTEXT           18
  342. #define PTRACE_WRITETEXT          19
  343. #define PTRACE_GETFPAREGS         20
  344. #define PTRACE_SETFPAREGS         21
  345.  
  346. /* There are for debugging 64-bit processes, either from a 32 or 64 bit
  347.  * parent.  Thus their complements are for debugging 32-bit processes only.
  348.  */
  349.  
  350. #define PTRACE_GETREGS64      22
  351. #define PTRACE_SETREGS64      23
  352. /* PTRACE_SYSCALL is 24 */
  353. #define PTRACE_GETFPREGS64      25
  354. #define PTRACE_SETFPREGS64      26
  355.  
  356. #endif /* !(_SPARC64_PTRACE_H) */
  357.